﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.UI;
using System.Web.UI.WebControls;
using PortalCurriculo.Domain;
using PortalCurriculo.Util.Translation;
using PortalCurriculo.WebUI.Helpers;

namespace PortalCurriculo.WebUI.UserControls.Vaga
{
    public partial class Fases : UserControl
    {
        public bool Edicao { get; set; }
        private static List<Evento> Eventos { get; set; }
        public int IdVaga { get; set; }
        public bool MostrarDescricao { private get; set; }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack) return;

            pnlEdicao.Visible = Edicao;
            PreencherTipoEvento();

            if (IdVaga == 0) return;

            Eventos = new Evento { IdVaga = IdVaga }.ListarPorVaga();
            PreencherListView();
        }

        private void PreencherTipoEvento()
        {
            List<TipoEvento> tipoEventos = new TipoEvento().SelecionarAtivos();
            WebHelper.FillDropDownList(ddlTipoEvento, tipoEventos, true);
        }

        protected void lsvEvento_ItemDataBound(object sender, ListViewItemEventArgs e)
        {
            var item = (ListViewDataItem)e.Item;
            var evento = (Evento)item.DataItem;

            var tipoEvento = (Label)item.FindControl("lblTipoEvento");
            tipoEvento.Text = evento.TipoEvento.Descricao;
            tipoEvento.ToolTip = evento.Descricao;
            ((Label)item.FindControl("lblTempo")).Text = TimeHelper.ConverterMinutos(evento.Duracao, AppRelativeVirtualPath);
            ((Label)item.FindControl("lblMaximoProfissionais")).Text = evento.MaximoProfissionais.ToString();

            if (MostrarDescricao)
            {
                var descricao = (Label)item.FindControl("lblDescricao");
                descricao.Text = evento.Descricao;
                descricao.Visible = true;
            }

            if (Edicao)
            {
                ((ImageButton)item.FindControl("imbExcluirEvento")).Attributes.Add("Id", evento.Id.ToString());
                var subir = (ImageButton)item.FindControl("imbSubir");
                var descer = (ImageButton)item.FindControl("imbDescer");

                subir.Attributes.Add("Id", evento.Id.ToString());
                descer.Attributes.Add("Id", evento.Id.ToString());

                if (evento.Ordem == 0)
                    subir.Visible = false;
                if (evento.Ordem == Eventos.Count - 1)
                    descer.Visible = false;
            }
            item.FindControl("pnlAcoes").Visible = Edicao;
        }

        protected void imbExcluirEvento_Click(object sender, ImageClickEventArgs e)
        {
            int id = int.Parse(((ImageButton)sender).Attributes["Id"]);

            Evento evento = (from eventoLinq in Eventos
                             where eventoLinq.Id == id
                             select eventoLinq).FirstOrDefault();

            Eventos.Remove(evento);
            ReordenarLista();

            evento.Inative();

            PreencherListView();
        }

        private void PreencherListView()
        {
            lsvEvento.DataSource = Eventos.OrderBy(evento => evento.Ordem);
            lsvEvento.DataBind();
        }

        protected void imbSubir_Click(object sender, EventArgs e)
        {
            int id = int.Parse(((ImageButton)sender).Attributes["Id"]);
            MoverOrdem(id, true);
        }

        protected void imbDescer_Click(object sender, EventArgs e)
        {
            int id = int.Parse(((ImageButton)sender).Attributes["Id"]);
            MoverOrdem(id, false);
        }

        private void MoverOrdem(int id, bool subir)
        {
            var evento = (from linq in Eventos
                          where linq.Id.Equals(id)
                          select linq).FirstOrDefault();

            var ordemTroca = subir ? evento.Ordem - 1 : evento.Ordem + 1;
            var eventoTroca = (from linq in Eventos
                               where linq.Ordem.Equals(ordemTroca)
                               select linq).FirstOrDefault();

            SalvarOrdem(subir, evento);
            SalvarOrdem(!subir, eventoTroca);

            PreencherListView();
        }

        private void SalvarOrdem(bool subir, Evento evento)
        {
            if (subir)
                evento.Ordem--;
            else
                evento.Ordem++;
            evento.Save();
        }

        protected void lnkAdicionarEvento_Click(object sender, EventArgs e)
        {
            if (!Page.IsValid) return;

            if (Eventos == null) Eventos = new List<Evento>();

            var evento = new Evento
                             {
                                 IdTipoEvento = int.Parse(ddlTipoEvento.SelectedValue),
                                 MaximoProfissionais =
                                     chkMultiplosProfissionais.Checked == false
                                         ? 1
                                         : txtMaximoProfissionais.Value,
                                 Duracao = int.Parse(ddlTempoEntrevista.SelectedItem.Value),
                                 Ativo = true,
                                 Descricao = txtDescricaoEvento.Text,
                                 IdVaga = IdVaga,
                                 Ordem = Eventos.Count
                             };

            evento.Save();
            Eventos.Add(evento);
            LimparCampos();
            PreencherListView();
            WebHelper.ShowMessageBox("Fase incluída com sucesso!", ref uppFases);

            ddlTipoEvento.Focus();
        }

        private void LimparCampos()
        {
            txtDescricaoEvento.Text = string.Empty;
            ddlTipoEvento.SelectedIndex = 0;
            ddlTempoEntrevista.SelectedIndex = 0;
            chkMultiplosProfissionais.Checked = false;
            txtMaximoProfissionais.Value = 1;
            txtMaximoProfissionais.Visible = false;
            lblMaximoProfissionais.Visible = false;
        }

        protected void chkMultiplosProfissionais_CheckedChanged(object sender, EventArgs e)
        {
            lblMaximoProfissionais.Visible = chkMultiplosProfissionais.Checked;
            txtMaximoProfissionais.Visible = chkMultiplosProfissionais.Checked;
        }

        private void ReordenarLista()
        {
            int index = 0;

            foreach (var evento in Eventos.OrderBy(evento => evento.Ordem))
            {
                if (evento.Ordem == index)
                {
                    index++;
                    continue;
                }

                evento.Ordem = index;
                evento.Save();
            }
        }
    }
}